package cn.iocoder.yudao.framework.common.enums.pay;

import cn.hutool.core.util.ArrayUtil;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Objects;

/**
 * 转账状态枚举
 * 统一管理各个模块中的转账状态
 */
@Getter
@AllArgsConstructor
public enum TransferStatusEnum implements ArrayValuable<Integer> {

    WAITING(0, "等待转账"),
    IN_PROGRESS(10, "转账进行中"),
    SUCCESS(20, "转账成功"),
    CLOSED(30, "转账关闭"),
    ;

    public static final Integer[] ARRAYS = Arrays.stream(values()).map(TransferStatusEnum::getStatus).toArray(Integer[]::new);

    /**
     * 状态
     */
    private final Integer status;
    /**
     * 名称
     */
    private final String name;

    @Override
    public Integer[] array() {
        return ARRAYS;
    }

    /**
     * 根据状态获取枚举
     *
     * @param status 状态
     * @return 枚举
     */
    public static TransferStatusEnum valueOf(Integer status) {
        if (status == null) {
            return null;
        }
        return ArrayUtil.firstMatch(item -> item.getStatus().equals(status), values());
    }

    /**
     * 获取转账状态名称
     *
     * @param status 状态
     * @return 名称
     */
    public static String getNameByStatus(Integer status) {
        TransferStatusEnum statusEnum = valueOf(status);
        return statusEnum != null ? statusEnum.getName() : "";
    }
    
    /**
     * 是否为等待转账状态
     * @param status 状态
     * @return 是否为等待转账状态
     */
    public static boolean isWaiting(Integer status) {
        return Objects.equals(status, WAITING.getStatus());
    }
    
    /**
     * 是否为转账进行中状态
     * @param status 状态
     * @return 是否为转账进行中状态
     */
    public static boolean isInProgress(Integer status) {
        return Objects.equals(status, IN_PROGRESS.getStatus());
    }
    
    /**
     * 是否为转账成功状态
     * @param status 状态
     * @return 是否为转账成功状态
     */
    public static boolean isSuccess(Integer status) {
        return Objects.equals(status, SUCCESS.getStatus());
    }
    
    /**
     * 是否为转账关闭状态
     * @param status 状态
     * @return 是否为转账关闭状态
     */
    public static boolean isClosed(Integer status) {
        return Objects.equals(status, CLOSED.getStatus());
    }
    
    /**
     * 是否处于待转账或者转账中的状态
     * @param status 状态
     * @return 是否处于待转账或者转账中的状态
     */
    public static boolean isPendingStatus(Integer status) {
        return isWaiting(status) || isInProgress(status);
    }
} 